#pragma once

#include "mod.h"

namespace sfc::hash {

struct Hasher {
  u64 _0;
};

template <class T>
struct Hash : T {
  ~Hash() = delete;

  using T::hash;
};

template <>
struct Hash<char> {
  char _0;
  auto hash() const -> u64 {
    return _0;
  }
};

template <>
struct Hash<signed char> {
  signed char _0;
  auto hash() const -> u64 {
    return _0;
  }
};

template <>
struct Hash<unsigned char> {
  unsigned char _0;
  auto hash() const -> u64 {
    return _0;
  }
};

template <>
struct Hash<short> {
  short _0;
  auto hash() const -> u64 {
    return _0;
  }
};

template <>
struct Hash<unsigned short> {
  unsigned short _0;
  auto hash() const -> u64 {
    return _0;
  }
};

template <>
struct Hash<int> {
  int _0;
  auto hash() const -> u64 {
    return _0;
  }
};

template <>
struct Hash<unsigned int> {
  unsigned int _0;
  auto hash() const -> u64 {
    return _0;
  }
};

template <>
struct Hash<long> {
  long _0;
  auto hash() const -> u64 {
    return _0;
  }
};

template <>
struct Hash<unsigned long> {
  unsigned long _0;
  auto hash() const -> u64 {
    return _0;
  }
};

template <>
struct Hash<long long> {
  long _0;
  auto hash() const -> u64 {
    return u64(_0);
  }
};

template <>
struct Hash<unsigned long long> {
  unsigned long _0;
  auto hash() const -> u64 {
    return u64(_0);
  }
};

}  // namespace sfc::hash
